package ajedrez;

import java.text.SimpleDateFormat;
import java.util.Calendar;


public class Tablero
{
    public static int[] TableroAnterior={-4, -2, -3, -5, -6, -3, -2, -4,
                               -1, -1, -1, -1, -1, -1, -1, -1,
                                0,  0,  0,  0,  0,  0,  0,  0,
                                0,  0,  0,  0,  0,  0,  0,  0,
                                0,  0,  0,  0,  0,  0,  0,  0,
                                0,  0,  0,  0,  0,  0,  0,  0,
                                1,  1,  1,  1,  1,  1,  1,  1,
                                4,  2,  3,  5,  6,  3,  2,  4};
    public static int[] TableroNuevo= {  -4, -2, -3, -5, -6, -3, -2, -4,
                               -1, -1, -1, -1, -1, -1, -1, -1,
                                0,  0,  0,  0,  0,  0,  0,  0,
                                0,  0,  0,  0,  0,  0,  0,  0,
                                0,  0,  0,  0,  0,  0,  0,  0,
                                0,  0,  0,  0,  0,  0,  0,  0,
                                1,  1,  1,  1,  1,  1,  1,  1,
                                4,  2,  3,  5,  6,  3,  2,  4};
        
    public int[] Juego = new int[128];
    
    public static final int TamanioTablero = 128;

    public int pos = 0;

    public int pieza = 0;

    public int jugador = 0;

    public static final int PATRON = 136; // PATRON BINARIO: 1XXX 1XXX

    public static final int LIBRE = 0;
    public static final int PEON = 1;
    public static final int CABALLO = 2;
    public static final int ALFIL = 3;
    public static final int TORRE = 4;
    public static final int DAMA = 5;
    public static final int REY = 6;

    public static final int NEGRAS = -1;
    public static final int BLANCAS = 1;
    
    public Tablero()
    {}

    public Tablero(int[] pJuego)
    {
        this.Juego = pJuego;
    }


    public static int[] ConvertirTablero(int[] pJuego)
    {
        int[] jRetornar = new int[128];

        // Fila 1
        jRetornar[0] = pJuego[0];
        jRetornar[1] = pJuego[1];
        jRetornar[2] = pJuego[2];
        jRetornar[3] = pJuego[3];
        jRetornar[4] = pJuego[4];
        jRetornar[5] = pJuego[5];
        jRetornar[6] = pJuego[6];
        jRetornar[7] = pJuego[7];
        // Fila 2
        jRetornar[16] = pJuego[8];
        jRetornar[17] = pJuego[9];
        jRetornar[18] = pJuego[10];
        jRetornar[19] = pJuego[11];
        jRetornar[20] = pJuego[12];
        jRetornar[21] = pJuego[13];
        jRetornar[22] = pJuego[14];
        jRetornar[23] = pJuego[15];
        // Fila 3
        jRetornar[32] = pJuego[16];
        jRetornar[33] = pJuego[17];
        jRetornar[34] = pJuego[18];
        jRetornar[35] = pJuego[19];
        jRetornar[36] = pJuego[20];
        jRetornar[37] = pJuego[21];
        jRetornar[38] = pJuego[22];
        jRetornar[39] = pJuego[23];
        // Fila 4
        jRetornar[48] = pJuego[24];
        jRetornar[49] = pJuego[25];
        jRetornar[50] = pJuego[26];
        jRetornar[51] = pJuego[27];
        jRetornar[52] = pJuego[28];
        jRetornar[53] = pJuego[29];
        jRetornar[54] = pJuego[30];
        jRetornar[55] = pJuego[31];
        // Fila 5
        jRetornar[64] = pJuego[32];
        jRetornar[65] = pJuego[33];
        jRetornar[66] = pJuego[34];
        jRetornar[67] = pJuego[35];
        jRetornar[68] = pJuego[36];
        jRetornar[69] = pJuego[37];
        jRetornar[70] = pJuego[38];
        jRetornar[71] = pJuego[39];
        // Fila 6
        jRetornar[80] = pJuego[40];
        jRetornar[81] = pJuego[41];
        jRetornar[82] = pJuego[42];
        jRetornar[83] = pJuego[43];
        jRetornar[84] = pJuego[44];
        jRetornar[85] = pJuego[45];
        jRetornar[86] = pJuego[46];
        jRetornar[87] = pJuego[47];
        // Fila 7
        jRetornar[96] = pJuego[48];
        jRetornar[97] = pJuego[49];
        jRetornar[98] = pJuego[50];
        jRetornar[99] = pJuego[51];
        jRetornar[100] = pJuego[52];
        jRetornar[101] = pJuego[53];
        jRetornar[102] = pJuego[54];
        jRetornar[103] = pJuego[55];
        // Fila 8
        jRetornar[112] = pJuego[56];
        jRetornar[113] = pJuego[57];
        jRetornar[114] = pJuego[58];
        jRetornar[115] = pJuego[59];
        jRetornar[116] = pJuego[60];
        jRetornar[117] = pJuego[61];
        jRetornar[118] = pJuego[62];
        jRetornar[119] = pJuego[63];

        return jRetornar;
    }

    public static void mvTablero(int[] TableroDestino, int[] TableroFuente){
        for(int i=0; i<64; i++){
            TableroDestino[i]=TableroFuente[i];
        }
    }
    
    public static int[] getTableroParaFrontEnd(int[] pJuego)
    {
        int[] vRetornar = new int[64];

        // Fila 1
        vRetornar[0] = pJuego[0];
        vRetornar[1] = pJuego[1];
        vRetornar[2] = pJuego[2];
        vRetornar[3] = pJuego[3];
        vRetornar[4] = pJuego[4];
        vRetornar[5] = pJuego[5];
        vRetornar[6] = pJuego[6];
        vRetornar[7] = pJuego[7];
        // Fila 2
        vRetornar[8] = pJuego[16];
        vRetornar[9] = pJuego[17];
        vRetornar[10] = pJuego[18];
        vRetornar[11] = pJuego[19];
        vRetornar[12] = pJuego[20];
        vRetornar[13] = pJuego[21];
        vRetornar[14] = pJuego[22];
        vRetornar[15] = pJuego[23];
        // Fila 3
        vRetornar[16] = pJuego[32];
        vRetornar[17] = pJuego[33];
        vRetornar[18] = pJuego[34];
        vRetornar[19] = pJuego[35];
        vRetornar[20] = pJuego[36];
        vRetornar[21] = pJuego[37];
        vRetornar[22] = pJuego[38];
        vRetornar[23] = pJuego[39];
        // Fila 4
        vRetornar[24] = pJuego[48];
        vRetornar[25] = pJuego[49];
        vRetornar[26] = pJuego[50];
        vRetornar[27] = pJuego[51];
        vRetornar[28] = pJuego[52];
        vRetornar[29] = pJuego[53];
        vRetornar[30] = pJuego[54];
        vRetornar[31] = pJuego[55];
        // Fila 5
        vRetornar[32] = pJuego[64];
        vRetornar[33] = pJuego[65];
        vRetornar[34] = pJuego[66];
        vRetornar[35] = pJuego[67];
        vRetornar[36] = pJuego[68];
        vRetornar[37] = pJuego[69];
        vRetornar[38] = pJuego[70];
        vRetornar[39] = pJuego[71];
        // Fila 6
        vRetornar[40] = pJuego[80];
        vRetornar[41] = pJuego[81];
        vRetornar[42] = pJuego[82];
        vRetornar[43] = pJuego[83];
        vRetornar[44] = pJuego[84];
        vRetornar[45] = pJuego[85];
        vRetornar[46] = pJuego[86];
        vRetornar[47] = pJuego[87];
        // Fila 7
        vRetornar[48] = pJuego[96];
        vRetornar[49] = pJuego[97];
        vRetornar[50] = pJuego[98];
        vRetornar[51] = pJuego[99];
        vRetornar[52] = pJuego[100];
        vRetornar[53] = pJuego[101];
        vRetornar[54] = pJuego[102];
        vRetornar[55] = pJuego[103];
        // Fila 8
        vRetornar[56] = pJuego[112];
        vRetornar[57] = pJuego[113];
        vRetornar[58] = pJuego[114];
        vRetornar[59] = pJuego[115];
        vRetornar[60] = pJuego[116];
        vRetornar[61] = pJuego[117];
        vRetornar[62] = pJuego[118];
        vRetornar[63] = pJuego[119];

        return vRetornar;
    }

    public Tablero(int[] pJuego, int pPos, int pPieza, int pJugador)
    {
        Juego = new int[128];


        System.arraycopy(pJuego, 0, this.Juego, 0, 128);

        //this.Juego = pJuego;
        this.pos = pPos;
        this.pieza = pPieza;
        this.jugador = pJugador;
    }

    public Tablero(Tablero pTablero)
    {
        this.Juego = pTablero.Juego;
        this.pos = pTablero.pos;
        this.pieza = pTablero.pieza;
        this.jugador = pTablero.jugador;
    }

    public static void ImprimirTablero(int[] pJuego)
    {
        int Patron = PATRON;

        //pJuego = ConvertirTablero(pJuego);
        
        System.out.println();
        System.out.println(" -- " + now() + " -- ");
        System.out.println("            Tablero:");

        for(int i = 0; i < 128; i++)
        {
            if((i & Patron) == 0)
            {
                String valor = pJuego[i] + "";
                int tamanio = valor.length();
                if(tamanio==1)
                    System.out.print("  " + pJuego[i] + " ");
                else
                    System.out.print(" " + pJuego[i] + " ");
            }
            if( i == 119 || i == 103 || i == 87 || i == 71 || i == 55 || i == 39 || i == 23 || i == 7)
                System.out.println("");
        }

        System.out.println();
    }

    public static void ImprimirMovimiento (int[] pViejaJuegada, int[] pNuevaJuegada)
    {
        int Patron = PATRON;
        int i = 0;

        boolean impresion1 = true;
        boolean impresion2 = true;


        //pViejaJuegada = ConvertirTablero(pViejaJuegada);
        //pNuevaJuegada = ConvertirTablero(pNuevaJuegada);

        System.out.println();
        System.out.println(" ----------------------- " + now() + " ----------------------- ");
        System.out.println("         Juagada Vieja:                            Jugada Nueva:");

        try
        {
            while (i < 128)
            {
                if((i & Patron) == 0)
                {
                    String valor;

                    valor = (impresion1) ? "" + pViejaJuegada[i] : "" + pNuevaJuegada[i];

                    int tamanio = valor.length();
                    if(tamanio==1)
                        System.out.print("  " + valor + " ");
                    else
                        System.out.print(" " + valor + " ");
                }

                if((i == 119 || i == 103 || i == 87 || i == 71 || i == 55 || i == 39 || i == 23 || i == 7) && impresion1)
                    System.out.print("          ");
                else if((i == 103 || i == 87 || i == 71 || i == 55 || i == 39 || i == 23 || i == 7) && !impresion1)
                    System.out.println("");


                if(i == 15 || i == 31 || i == 47 || i == 63 || i == 79 || i == 95 || i == 111)
                {
                    if(impresion1)
                    {
                        impresion1 = false;
                        impresion2 = true;
                        i -= 16;
                    }
                    else if(impresion2)
                    {
                        impresion1 = true;
                        impresion2 = false;
                    }
                }

                if(i == 127 && impresion1)
                {
                    impresion1 = false;
                    impresion2 = true;
                    i -= 16;
                }

                i++;
            }
        }
        catch(Exception e)
        {
            System.out.println("Error: " + e.toString());
        }


        System.out.println();
    }

    public static void ImprimirMovimientoFrontEnd(int[] pViejaJuegada, int[] pNuevaJuegada)
    {

        int i = 0;

        boolean impresion1 = true;
        boolean impresion2 = true;


        //pViejaJuegada = ConvertirTablero(pViejaJuegada);
        //pNuevaJuegada = ConvertirTablero(pNuevaJuegada);

        System.out.println();
        System.out.println(" ----------------------- " + now() + " ----------------------- ");
        System.out.println("         Juagada Vieja:                            Jugada Nueva:");

        try
        {
            while (i < 64)
            {

                String valor;

                valor = (impresion1) ? "" + pViejaJuegada[i] : "" + pNuevaJuegada[i];

                int tamanio = valor.length();
                if(tamanio==1)
                    System.out.print("  " + valor + " ");
                else
                    System.out.print(" " + valor + " ");
 

                if((i == 7 || i == 15 || i == 23 || i == 31 || i == 39 || i == 47 || i == 55 || i == 63) && impresion1)
                    System.out.print("          ");
                else if((i == 7 || i == 15 || i == 23 || i == 31 || i == 39 || i == 47 || i == 55) && !impresion1)
                    System.out.println("");


                if(i == 7 || i == 15 || i == 23 || i == 31 || i == 39 || i == 47 || i == 55)
                {
                    if(impresion1)
                    {
                        impresion1 = false;
                        impresion2 = true;
                        i -= 8;
                    }
                    else if(impresion2)
                    {
                        impresion1 = true;
                        impresion2 = false;
                    }
                }

                if(i == 63 && impresion1)
                {
                    impresion1 = false;
                    impresion2 = true;
                    i -= 8;
                }

                i++;
            }
        }
        catch(Exception e)
        {
            System.out.println("Error: " + e.toString());
        }


        System.out.println();
    }


    public static final String DATE_FORMAT_NOW = "KK:mm:ss a - dd/MM/yyyy";

    public static String now()
    {
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
        return sdf.format(cal.getTime());
    }

}